import Cookies from "js-cookie"
import axios from 'axios'
import * as qiniu from 'qiniu-js'

var subscriptionList = [] as {
    id: string,
    subscription: any
}[]

// 取消上传
export function cancelUpload(id: string) {
    subscriptionList.forEach((item) => {
        if (item.id == id) {
            item.subscription.unsubscribe() // 上传取消
        }
    })
}

// 删除文件
export function delectFile(url: string) {

    return new Promise((resolve, reject) => {
        // 做个简单的url验证
        if (url.substring(0, cdnUrl.length) != cdnUrl || cdnUrl.length > url.length - 2) {
            reject({ code: 444, msg: "未知错误" })
            return
        }
        // 裁剪key
        let key = url.substring(cdnUrl.length, url.length)

        let pass = Cookies.get("z-pass")
        axios.get(apiUrl + 'delectFile?key=' + key + (pass ? `&p=${pass}` : '')).then((res: any) => {
            // 需要密码
            if (res.data.code == 502) {
                var text = prompt('本图床暂不对外开发，只在内部使用，请输入密码')
                if (text) {
                    Cookies.set("z-pass", text, { expires: 30, path: "/", });
                    // 重新调用
                    delectFile(url).then((r)=>{
                        resolve(r)
                    }).catch((e)=>{
                        reject(e)
                    })
                }
                return // 结束
            }
            if (res.data.code == 200) {
                resolve(res.data)
                return
            }
            reject(res.data)
        }).catch(() => {
            reject({ code: 444, msg: "网络错误" })
        })
    })
}

// 开始上传
export function upFlie(file: any, id: string, next: Function, complete: Function, error: Function) {
    if (typeof file == 'undefined') {
        alert('没有文件')
        return
    }



    let pass = Cookies.get("z-pass")
    axios.get(apiUrl + 'uploadToken' + (pass ? `?p=${pass}` : '')).then((res: any) => {

        if (res.data.code != 200) {
            // 请求输入密码
            var text = prompt('本图床暂不对外开发，只在内部使用，请输入密码')
            if (text) {
                Cookies.set("z-pass", text, { expires: 30, path: "/", });
                // 重新调用
                upFlie(file, id, next, complete, error)
            } else {
                error()
            }
            return // 结束
        }

        // console.log(res.data)
        var token = res.data.data.uploadToken

        //获取最后一个.的位置
        var index = file.name.lastIndexOf(".");
        var ext = '' // 后缀
        if (index != -1 && index > file.name.length - 8) { // 如果后缀太长，当没有
            //获取后缀
            ext = file.name.substr(index);
        }
        var d = new Date();
        // 组装key 年/月/日/时间戳+随机数.后缀
        let d1 = `${dateFormat('HH', d)}${dateFormat('mm', d)}${dateFormat('ss', d)}${dateFormat('S', d)}`
        // ${d.getTime()}${Math.floor(Math.random()*10)}
        let key = `${dateFormat('yyyy', d)}/${dateFormat('MM', d)}/${dateFormat('dd', d)}/${d1}${ext}`
        let putExtra = {
            fname: file.name, // 文件原始文件名
            // mimeType: 'text/plain',
            customVars: { 'x:test': 'qiniu' }, // 用来放置自定义变量,变量名必须以 x: 开始
            // metadata: { 'x-qn-meta': 'qiniu' }, // 用来防止自定义 meta，变量名必须以 x-qn-meta-开始
        }
        let config = {}
        const observable = qiniu.upload(file, key, token, putExtra, config)
        const observer = {
            next(res: any) {
                next(res)
            },
            error(err: any) {
                error()
            },
            complete(res: any) {
                complete(res)
            },
        }
        const subscription = observable.subscribe(observer) // 上传开始
        subscriptionList.push({
            id,
            subscription
        })
    }).catch(() => {
        error()
    })

    // subscription.unsubscribe() // 上传取消
}

export function copyText(text: string) {
    let oInput = document.createElement('input');
    oInput.value = text;
    document.body.appendChild(oInput);
    oInput.select(); // 选择对象;
    // 执行浏览器复制命令
    /// 复制命令会将当前选中的内容复制到剪切板中
    /// 如这里构建的 Input标签 
    document.execCommand("Copy");
    ///复制成功后再将构造的标签 移除
    oInput.remove()
}
// cdn图床的地址
export const cdnUrl = import.meta.env.VITE_BASE_CDN_API
// api的地址
export const apiUrl = import.meta.env.VITE_BASE_API

// 格式化时间
export function dateFormat(fmt: string, date: any) {
    let ret;
    const opt = {
        "y+": date.getFullYear().toString(),        // 年
        "M+": (date.getMonth() + 1).toString(),     // 月
        "d+": date.getDate().toString(),            // 日
        "H+": date.getHours().toString(),           // 时
        "m+": date.getMinutes().toString(),         // 分
        "s+": date.getSeconds().toString(),          // 秒
        "S": date.getMilliseconds().toString()     //毫秒
        // 有其他格式化字符需求可以继续添加，必须转化成字符串
    } as any;
    for (let k in opt) {
        ret = new RegExp("(" + k + ")").exec(fmt);
        if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
        };
    };
    return fmt;
}